<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Iterator 遍历器</title>
</head>
<body>
<script>
    /**
     * 模拟实现一个遍历器
     * 具有遍历器方法，obj[Symbol.iterator]是否存在。存在则返回Symbol.iterator方法。可以使用for...of。
     * 具有遍历器方法： Array，Map，Set，String，TypedArray，函数的arguments对象，NodeList对象
     * */
    const it = makeIterator(['a', 'b']);

    it.next() // { value: "a", done: false }
    it.next() // { value: "b", done: false }
    it.next() // { value: undefined, done: true }

    function makeIterator(array) {
        let nextIndex = 0;
        return {
            next: function () {
                // ++a是先加再取值； a++是先取值再加。
                return nextIndex < array.length ?
                    {value: array[nextIndex++], done: false} :
                    {value: undefined, done: true};
            }
        };
    }

    const arr = [1, 2, 3];
    const arrIterator = arr[Symbol.iterator]()
    // console.log(arrIterator.next())
    // console.log(arrIterator.next())
    // console.log(arrIterator.next())
    const info = {
        name: 'proxy',
        age: 18,
        // yield* 后面只能是可迭代对象，如：Array，Map，Set，String，TypedArray，函数的arguments对象，NodeList对象。
        [Symbol['iterator']]: function* () {
            return yield* Object.keys(this)
            // yield 'extra' // 不会执行

            // yield* Object.keys(this)
            // yield 'extra' // 会执行
        }
    }
    const iterator = info[Symbol['iterator']]();
    console.log(iterator.next())
    console.log(iterator.next())
    for (let key of info) {
        console.log(key);
    }


    function* getData() {
        return yield 'proxy'
    }

    const generator = getData()
    console.log(generator.next())
</script>
</body>
</html>
